home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / GRAPHICS / GIF2RPC.SPK / source / 16bpp_48bit / c / jjn < prev    next >
Text File  |  1995-10-16  |  6KB  |  167 lines

  1. /* jjn.c
  2.  * AUTHOR:      Cy Booker, cy@cheepnis.demon.co.uk
  3.  * LICENSE:     FreeWare, Copyright (c) 1995 Cy Booker
  4.  *
  5.  * filter:              *  7  5
  6.  *                3  5  7  5  3
  7.  *                1  3  5  3  1         (1/48)
  8.  */
  9.  
  10. #include "internal.h"
  11.  
  12. #include <assert.h>
  13. #include <string.h>             /* memset() */
  14. #include <stdlib.h>             /* calloc() */
  15.  
  16. #include "OS:hourglass.h"
  17. #include "OS:macros.h"
  18.  
  19.  
  20.  
  21. /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  22.  */
  23.  
  24. extern bool process_gif_16bpp_jarvis_judice_ninke_48bit(
  25.                 const process_gif       *p) {
  26.   byte                  *rove;
  27.   int                   width, height;
  28.   int                   x, y;
  29.   const os_colour       *palette;
  30.   int                   line_length;
  31.   int                   *buffer, *this_row, *next_row, *botm_row;
  32.   int                   buffer_width;
  33.   int                   red, grn, blu;
  34.   bits                  t;
  35.   int                   error_red, error_grn, error_blu;
  36.   int                   temp_red, temp_grn, temp_blu;
  37.   rgbtupleout           error;
  38.   rgbtupleout_fn        fn;
  39.  
  40.   assert(p);
  41.   assert(p->pixel_width > 0);
  42.   assert(p->pixel_height > 0);
  43.   assert(p->in_palette.colours);
  44.   assert(p->fn);
  45.  
  46.   /*
  47.    * jarvis_judice_ninke requires storing error info for two pixels to right and two pixels to left
  48.    * so we will just allocate two extra columns for each row and not do any edge checks
  49.    * each entry is stored as {r*SCALE, g*SCALE, b*SCALE}
  50.    */
  51.   buffer_width = (2 + p->pixel_width + 2) * 3;
  52.   buffer = calloc(1, sizeof(*buffer) * (buffer_width * 3));
  53.   if (!buffer) {
  54.     /*
  55.      * oh dear
  56.      */
  57.     return TRUE;
  58.   }
  59.  
  60.   /*
  61.    * not we pre-load values from the process_gif array
  62.    * because it considerably helps the compiler produce better code
  63.    */
  64.   rove = p->buffer;
  65.   width = p->pixel_width;
  66.   height = p->pixel_height;
  67.   palette = p->in_palette.colours;
  68.   line_length = p->line_length;
  69.   fn = p->fn;
  70.   for (y= height; (y > 0); y--) {
  71.     if ((y & 7) == 0) {
  72.       xhourglass_percentage((y * 100) / height);
  73.     }
  74.     this_row = buffer + (buffer_width * ((y + 3) % 3)) + 2*3;
  75.     next_row = buffer + (buffer_width * ((y + 2) % 3)) + 2*3;
  76.     botm_row = buffer + (buffer_width * ((y + 1) % 3)) + 2*3;
  77.     /* bottom row has no errors */
  78.     memset(botm_row, 0, sizeof(*botm_row) * (buffer_width - 2*3));
  79.     /*
  80.      * note that just because we are actually scanning/outputting right to left
  81.      * doesn't matter as far as jarvis_judice_ninke is concerned
  82.      * although it might help if we could ``snake''
  83.      */
  84.     for (x= width - 1; (x >= 0); x--) {
  85.       INPUT;
  86.  
  87.       red += *this_row++;                               /* add in errors from all rows */
  88.       grn += *this_row++;
  89.       blu += *this_row++;
  90.  
  91.       PROCESS;
  92.  
  93.       temp_red = (red * 7) / 48; error_red = red - (2 * temp_red);
  94.       temp_grn = (grn * 7) / 48; error_grn = grn - (2 * temp_grn);
  95.       temp_blu = (blu * 7) / 48; error_blu = blu - (2 * temp_blu);
  96.       this_row[ 0] += temp_red;                         /* this[ 1] += 7/48 */
  97.       this_row[ 1] += temp_grn;
  98.       this_row[ 2] += temp_blu;
  99.  
  100.       next_row[ 0] += temp_red;                         /* next[ 0] += 7/48 */
  101.       next_row[ 1] += temp_grn;
  102.       next_row[ 2] += temp_blu;
  103.  
  104.       temp_red = (red * 5) / 48; error_red -= 4 * temp_red;
  105.       temp_grn = (grn * 5) / 48; error_grn -= 4 * temp_grn;
  106.       temp_blu = (blu * 5) / 48; error_blu -= 4 * temp_blu;
  107.  
  108.       this_row[ 3] += temp_red;                         /* this[ 2] += 5/48 */
  109.       this_row[ 4] += temp_grn;
  110.       this_row[ 5] += temp_blu;
  111.  
  112.       next_row[ 3] += temp_red;                         /* next[ 1] += 5/48 */
  113.       next_row[ 4] += temp_grn;
  114.       next_row[ 5] += temp_blu;
  115.  
  116.       next_row[-3] += temp_red;                         /* next[-1] += 5/48 */
  117.       next_row[-2] += temp_grn;
  118.       next_row[-1] += temp_blu;
  119.  
  120.       botm_row[ 0] += temp_red;                         /* botm[ 0] += 5/48 */
  121.       botm_row[ 1] += temp_grn;
  122.       botm_row[ 2] += temp_blu;
  123.  
  124.       temp_red = (red * 3) / 48; error_red -= 4 * temp_red;
  125.       temp_grn = (grn * 3) / 48; error_grn -= 4 * temp_grn;
  126.       temp_blu = (blu * 3) / 48; error_blu -= 4 * temp_blu;
  127.  
  128.       next_row[ 6] += temp_red;                         /* next[ 2] += 3/48 */
  129.       next_row[ 7] += temp_grn;
  130.       next_row[ 8] += temp_blu;
  131.  
  132.       next_row[-6] += temp_red;                         /* next[-2] += 3/48 */
  133.       next_row[-5] += temp_grn;
  134.       next_row[-4] += temp_blu;
  135.  
  136.       botm_row[ 3] += temp_red;                         /* botm[ 1] += 3/48 */
  137.       botm_row[ 4] += temp_grn;
  138.       botm_row[ 5] += temp_blu;
  139.  
  140.       botm_row[-3] += temp_red;                         /* botm[-1] += 3/48 */
  141.       botm_row[-2] += temp_grn;
  142.       botm_row[-1] += temp_blu;
  143.  
  144.       temp_red = (red * 1) / 48; error_red -= temp_red;
  145.       temp_grn = (grn * 1) / 48; error_grn -= temp_grn;
  146.       temp_blu = (blu * 1) / 48; error_blu -= temp_blu;
  147.  
  148.       botm_row[-6] += temp_red;                         /* botm[-2] += 1/48 */
  149.       botm_row[-5] += temp_grn;
  150.       botm_row[-4] += temp_blu;
  151.  
  152.       botm_row[ 6] += error_red;                        /* botm[ 2] += 1/48 */
  153.       botm_row[ 7] += error_grn;
  154.       botm_row[ 8] += error_blu;
  155.  
  156.       next_row += 3;                                    /* adjust next_row pointer */
  157.       botm_row += 3;                                    /* adjust botm_row pointer */
  158.  
  159.     }
  160.     rove += line_length;
  161.   }
  162.   free(buffer);
  163.   return FALSE;
  164. }
  165.  
  166.  
  167.